package cl.loso.melon.server.persistencia;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import cl.loso.melon.server.gae.PMF;
import cl.loso.melon.server.model.AreaLVS;
import cl.loso.melon.server.model.NegocioLVS;
import cl.loso.melon.server.model.VisitaLVS;

import cl.loso.melon.server.model.SitioLVS;

public class AreaLVSDAO {
	private static Log log = LogFactory.getLog(AreaLVSDAO.class);

	public static List<AreaLVS> obtener(String idNegocio,String idSitio) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    SitioLVS sitio = null;
	    List<AreaLVS> detached=null;
	    Query query=null;
	    try {
	    	Key k1 = KeyFactory.createKey(NegocioLVS.class.getSimpleName(), Long.valueOf(idNegocio));
	    	Key k2 = KeyFactory.createKey(k1,SitioLVS.class.getSimpleName(), Long.valueOf(idSitio));
	    	sitio = pm.getObjectById(SitioLVS.class, k2);
	    	query = pm.newQuery(AreaLVS.class);
	    	query.setFilter("sitio == psitio");
	    	query.setOrdering("nombre ASC");//DESC
	    	query.declareParameters("SitioLVS psitio");
	    	detached = (List<AreaLVS>)pm.detachCopyAll((List<AreaLVS>)query.execute(sitio));			

	    } catch (Exception e) {
	    	log.error(e.getMessage());	        
	    } finally {
	        pm.close();
	    }
	    return detached;		

	}
	
	public static List<AreaLVS> obtener() throws Exception {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    List<AreaLVS> detached=null;
	    Query query=null;
	    try {
	    	query = pm.newQuery(AreaLVS.class);
	    	detached = (List<AreaLVS>)pm.detachCopyAll((List<AreaLVS>)query.execute());
	    } catch (Exception e) {
	    	log.error(e.getMessage());	        
	    } finally {
	        pm.close();
	    }
	    return detached;	
	}	

	public static void insertar(String idNegocio,String idSitio,String nombre, String fecha) {
	    Transaction tx=null;
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    SitioLVS sitio = null;
	    try {
 
	    	Key k1 = KeyFactory.createKey(NegocioLVS.class.getSimpleName(), Long.valueOf(idNegocio));
	    	Key k2 = KeyFactory.createKey(k1,SitioLVS.class.getSimpleName(), Long.valueOf(idSitio));
	    	sitio = pm.getObjectById(SitioLVS.class, k2);
	    	
	    	AreaLVS area=new AreaLVS();
	    	area.setNombre(nombre);
	    	area.setFecha(fecha);
	    	sitio.getAreas().add(area);
		   	
	    	tx = pm.currentTransaction();
	        tx.begin();
	    	pm.makePersistent(sitio);
	    	tx.commit();	
	    	
	    } catch (Exception e) {
	    	log.error("insertar " + e.getMessage());
	    } finally {
	    
	    	if (tx.isActive()) {
	            tx.rollback();
	        }

	    	if (!pm.isClosed()) {
                pm.close();
            }

	    }			
	}	


	public static AreaLVS getAreaLVSbyId(Long idNegocio, Long idSitio,Long idArea) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    AreaLVS area, detached = null;
	    try {
	    	Key k1 = KeyFactory.createKey(NegocioLVS.class.getSimpleName(), idNegocio);
	    	Key k2 = KeyFactory.createKey(k1,SitioLVS.class.getSimpleName(), idSitio);
	    	Key k3 = KeyFactory.createKey(k2,AreaLVS.class.getSimpleName(), idArea);
	    	area = pm.getObjectById(AreaLVS.class, k3);
	        detached = pm.detachCopy(area);
	    } catch (Exception e) {
	    	log.error(e.getMessage());	        
	    } finally {
	        pm.close();
	    }
	    return detached;		

	}	
	
	public static void actualizar(Long idNegocio, Long idSitio,Long idArea, String nombre, String fecha) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    AreaLVS area = null;
	    try {
	    	Key k1 = KeyFactory.createKey(NegocioLVS.class.getSimpleName(), idNegocio);
	    	Key k2 = KeyFactory.createKey(k1,SitioLVS.class.getSimpleName(), idSitio);
	    	Key k3 = KeyFactory.createKey(k2,AreaLVS.class.getSimpleName(), idArea);
	    	area = pm.getObjectById(AreaLVS.class, k3);
	    	area.setNombre(nombre);
	    	area.setFecha(fecha);
	    } catch (Exception e) {
	    	log.error(e.getMessage());	    	
	    } finally {
	        pm.close();
	    }		

	}	

	public static void borrar(Long idNegocio, Long idSitio,Long idArea) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    try {
	    	Key k1 = KeyFactory.createKey(NegocioLVS.class.getSimpleName(), idNegocio);
	    	Key k2 = KeyFactory.createKey(k1,SitioLVS.class.getSimpleName(), idSitio);
	    	Key k3 = KeyFactory.createKey(k2,AreaLVS.class.getSimpleName(), idArea);
	    	pm.deletePersistent(pm.getObjectById(AreaLVS.class, k3));
	    } catch (Exception e) {
	    	log.error(e.getMessage());	    	
	    } finally {
	        pm.close();
	    }		
		
	}	

	public static boolean existeVisita(String idNegocio,String idSitio,String idArea) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Query query = null;
		List<VisitaLVS> visitas = null;
		try {
			Map<String, Object> pars = new HashMap<String, Object>();
			String queryStr = "negocio == :neg && sitio == :sit && area == :are";
			pars.put("neg", Long.valueOf(idNegocio));
			pars.put("sit", Long.valueOf(idSitio));
			pars.put("are", Long.valueOf(idArea));
			query = pm.newQuery(VisitaLVS.class);
			query.setFilter(queryStr);
			visitas = (List<VisitaLVS>) pm
					.detachCopyAll((List<VisitaLVS>) query.executeWithMap(pars));
			if(!visitas.isEmpty()) return true;
			
	    } catch (Exception e) {
	    	log.error(e.getMessage());	    	
	    } finally {
	        pm.close();
	    }
	    return false; 
	}
	
	
	public static boolean buscarNombre(String pnombre,String idSitio) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    List<AreaLVS> detached = null;
	    boolean retorno=true;
	    try {
	    	Query query = pm.newQuery(AreaLVS.class,"nombre == pnombre");
	    	query.declareParameters("String pnombre");

	    	//detached = (List<AreaLVS>)pm.detachCopyAll((List<AreaLVS>) query.execute(pnombre));
	    	detached = (List<AreaLVS>)query.execute(pnombre.trim());
	    	
	    	int contador=0;
	    	if (detached.iterator().hasNext()) {
	            for (AreaLVS e : detached) {

	            	long idSitioPapa=e.getSitio().getKey().getId();//el papa
	            	long idSitioParam=Long.valueOf(idSitio).longValue();
	            	
	            	if(idSitioPapa==idSitioParam){
	            		contador++;
	            	}
	            }
	        } else {

	        }
	    	if(contador>0){
	    		retorno=false;
	    	}	    	
  
	    } catch (Exception e) {
	    	log.error(e.getMessage());	        
	    } finally {
	        pm.close();
	    }
	    return retorno;		

	}	
	
	
}
